x86: move ucode_cpu_info into per-CPU space
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 13 Jul 2009 10:31:34 +0000 (11:31 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 13 Jul 2009 10:31:34 +0000 (11:31 +0100)
Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/microcode.c
xen/arch/x86/microcode_amd.c
xen/arch/x86/microcode_intel.c
xen/include/asm-x86/microcode.h

index ebad6ef11d694fed6717b79e5cf8793bb0099867..0e97f36e89d11457147cf47a9fd4c9f43aeca8c7 100644 (file)
@@ -40,7 +40,7 @@ const struct microcode_ops *microcode_ops;
 
 static DEFINE_SPINLOCK(microcode_mutex);
 
-struct ucode_cpu_info ucode_cpu_info[NR_CPUS];
+DEFINE_PER_CPU(struct ucode_cpu_info, ucode_cpu_info);
 
 struct microcode_info {
     unsigned int cpu;
@@ -51,7 +51,7 @@ struct microcode_info {
 
 static void __microcode_fini_cpu(int cpu)
 {
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
 
     xfree(uci->mc.mc_valid);
     memset(uci, 0, sizeof(*uci));
@@ -67,7 +67,7 @@ static void microcode_fini_cpu(int cpu)
 int microcode_resume_cpu(int cpu)
 {
     int err = 0;
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
     struct cpu_signature nsig;
 
     gdprintk(XENLOG_INFO, "microcode: CPU%d resumed\n", cpu);
@@ -101,7 +101,7 @@ static int microcode_update_cpu(const void *buf, size_t size)
 {
     int err;
     unsigned int cpu = smp_processor_id();
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
 
     spin_lock(&microcode_mutex);
 
index 77053c258df53aebf5ffebd258c0516dc75cf0dd..3031f436d77c5911266a78fbad69b9fa3249b78e 100644 (file)
@@ -68,7 +68,7 @@ static int collect_cpu_info(int cpu, struct cpu_signature *csig)
 
 static int microcode_fits(void *mc, int cpu)
 {
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
     struct microcode_header_amd *mc_header = mc;
     unsigned int current_cpu_id;
     unsigned int equiv_cpu_id = 0x0;
@@ -125,7 +125,7 @@ out:
 static int apply_microcode(int cpu)
 {
     unsigned long flags;
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
     uint32_t rev, dummy;
     struct microcode_amd *mc_amd = uci->mc.mc_amd;
 
@@ -253,7 +253,7 @@ static int cpu_request_microcode(int cpu, const void *buf, size_t size)
     unsigned long offset = 0;
     int error = 0;
     int ret;
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
     void *mc;
 
     /* We should bind the task to the CPU */
index 7d8657ff2ffa10e35c8ebd7035a16a55553ff889..ac085a02a22a4835a146eaef1b1cc23b60d71fec 100644 (file)
@@ -99,7 +99,7 @@ static int collect_cpu_info(int cpu_num, struct cpu_signature *csig)
 static inline int microcode_update_match(
     int cpu_num, struct microcode_header_intel *mc_header, int sig, int pf)
 {
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu_num);
 
     return (sigmatch(sig, uci->cpu_sig.sig, pf, uci->cpu_sig.pf) &&
             (mc_header->rev > uci->cpu_sig.rev));
@@ -201,7 +201,7 @@ static int microcode_sanity_check(void *mc)
  */
 static int get_matching_microcode(void *mc, int cpu)
 {
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
     struct microcode_header_intel *mc_header = mc;
     struct extended_sigtable *ext_header;
     unsigned long total_size = get_totalsize(mc_header);
@@ -251,7 +251,7 @@ static int apply_microcode(int cpu)
     unsigned long flags;
     unsigned int val[2];
     int cpu_num = raw_smp_processor_id();
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu_num);
 
     /* We should bind the task to the CPU */
     BUG_ON(cpu_num != cpu);
@@ -362,7 +362,7 @@ static int cpu_request_microcode(int cpu, const void *buf, size_t size)
 
 static int microcode_resume_match(int cpu, struct cpu_signature *nsig)
 {
-    struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
 
     return (sigmatch(nsig->sig, uci->cpu_sig.sig, nsig->pf, uci->cpu_sig.pf) &&
             (uci->cpu_sig.rev > nsig->rev));
index 980da227dcd8d31d0a24e656092c25dd50f1bb47..f4a948147300afd4b3e750e85a77ff9e52da3a78 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef ASM_X86__MICROCODE_H
 #define ASM_X86__MICROCODE_H
 
+#include <xen/percpu.h>
+
 struct cpu_signature;
 struct ucode_cpu_info;
 
@@ -88,7 +90,7 @@ struct ucode_cpu_info {
     } mc;
 };
 
-extern struct ucode_cpu_info ucode_cpu_info[];
+DECLARE_PER_CPU(struct ucode_cpu_info, ucode_cpu_info);
 extern const struct microcode_ops *microcode_ops;
 
 #endif /* ASM_X86__MICROCODE_H */